/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package metodos;

import java.util.ArrayList;

public class TablaGini {

    String nombre; //El nombre del atributo.
    String nombreValor; //valor del atributo utilizado.
    ArrayList<ArrayList<String>> lista; //Aqui se guardan los datos que se reciben.
    ArrayList<Integer> datos; //Aqui se guarda la cantidad de veces que se repite cada dato
    ArrayList<Double> pi;//aqui se guarda la probabilidad de uso
    ArrayList<String> valoresClase; //Aqui se guardan los posibles valores de la clase
    String valorColumna; //Aqui se guardan el valor de la "clase"
    int cantidadColumna;//cantidad de registros con el valor de la clase
    double gini;//Indice Gini de la tabla
    String mayorValorClase;//contiene el valor del elemento de la clase que mas se repite

    public TablaGini(ArrayList<ArrayList<String>> lista, String valorColumna) {


        nombre = "Atributo";
        nombreValor = "Salida";
        this.lista = lista;
        datos = new ArrayList<Integer>();
        pi = new ArrayList<Double>();
        valoresClase = new ArrayList<String>();
        this.valorColumna = valorColumna;
        cantidadColumna = 0;
        gini = 1;


    }

    /**
     * Determina el indice gini de cada tabla
     * @param indiceColumna el indice de la columna de la vista minable con la que trabajará esta tabla.
     */
    public void Determinar(int indiceColumna, int indiceClase) {

        //Primero determinamos los posibles valoresClase que puede tomar este atributo.
        for (int i = 0; i < lista.size(); i++) {
            ArrayList<String> val = lista.get(i);
            AgregarValor(val.get(indiceClase));
        }

        //Determinar la cantidad de elementos de la clase por el valor de la columna
        for (int i = 0; i < lista.size(); i++) {
            ArrayList<String> val = lista.get(i);
            if (val.get(indiceColumna).equals(valorColumna)) {
                int indice = BuscarValor(val.get(indiceClase));
                datos.set(indice, datos.get(indice) + 1);
            }
        }

        //calculamos la cantidad de elementos en la columna
        for (int i = 0; i < datos.size(); i++) {
            cantidadColumna += datos.get(i);
        }

        //calculamos los valores de pi
        for (int i = 0; i < datos.size(); i++) {
            pi.add((double) datos.get(i) / cantidadColumna);
        }

        //calculamos el valor de gini para la tabla
        gini = 1;
        for (int i = 0; i < pi.size(); i++) {
            gini -= Math.pow(pi.get(i), 2);
        }

        if (gini == 0) {
            int indiceMayor = obtenerIndiceMayorDato();
            mayorValorClase = valoresClase.get(indiceMayor);
        }

        System.out.println("el gini para " + valorColumna + " es " + gini);

    }

    /**
     * Agrega un nuevo valor en la lista de valoresClase.
     * @param valor
     * @return 
     */
    public int AgregarValor(String valor) {
        int indice = BuscarValor(valor);
        if (indice == -1) {
            indice = valoresClase.size();
            valoresClase.add(valor);
            datos.add(0);
        }
        return indice;
    }

    /**
     * Busca el indice del valor en la tabla de diferentes valoresClase.
     * @param valor
     * @return 
     */
    private int BuscarValor(String valor) {
        for (int i = 0; i < valoresClase.size(); i++) {
            if (valoresClase.get(i).equals(valor)) {
                return i;
            }
        }
        return -1;
    }

    /**Función para obtener el elemento de mayor
     * 
     * @return 
     */
    private int obtenerIndiceMayorDato() {
        int indice = -1;
        int mayor = 0;
        for (int i = 0; i < datos.size(); i++) {
            if (datos.get(i) > mayor) {
                mayor = datos.get(i);
                indice = i;
            }
        }
        return indice;
    }
}
